package site.wlwsjsx.iot_backend.mapper;

import org.apache.ibatis.annotations.Mapper;
import site.wlwsjsx.iot_backend.dto.EnvHalfHourAggDTO;
import site.wlwsjsx.iot_backend.entity.LabEnv;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface LabEnvMapper {
    /**
     * 插入一条实验室环境数据
     *
     * @param labEnv 实验室环境实体对象
     * @return 影响的行数
     */
    int insert(LabEnv labEnv);

    /**
     * 根据实验室ID查询最新的一条环境数据
     *
     * @param labId 实验室ID
     * @return 最新的环境数据对象，如果不存在则返回null
     */
    LabEnv selectLatestByLabId(Integer labId);

    /**
     * 根据实验室ID分页查询历史环境数据
     *
     * @param labId    实验室ID
     * @param offset   分页偏移量
     * @param pageSize 每页大小
     * @return 历史环境数据列表
     */
    List<LabEnv> selectHistoryByLabId(Integer labId, int offset, int pageSize);

    /**
     * 根据实验室ID和时间范围分页查询历史环境数据
     *
     * @param labId     实验室ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param offset    分页偏移量
     * @param pageSize  每页大小
     * @return 历史环境数据列表
     */
    List<LabEnv> selectHistoryByLabIdAndTimeRange(
            Integer labId,
            LocalDateTime startTime,
            LocalDateTime endTime,
            int offset,
            int pageSize
    );

    /**
     * 查询符合条件的历史数据总条数（用于分页）
     *
     * @param labId     实验室ID
     * @param startTime 开始时间 (可为null)
     * @param endTime   结束时间 (可为null)
     * @return 总记录数
     */
    Long countHistoryByCondition(Integer labId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据实验室ID查询半小时聚合数据
     *
     * @param labId     实验室ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 半小时聚合数据列表
     */
    List<EnvHalfHourAggDTO> selectHalfHourAggByLabIdAndTimeRange(
            Integer labId,
            LocalDateTime startTime,
            LocalDateTime endTime
    );

    List<EnvHalfHourAggDTO> selectHistoryByLabIdAndTimeRangeWithLimit(Integer labId, LocalDateTime startTime, LocalDateTime endTime, Integer limit);

    List<EnvHalfHourAggDTO> selectEnvHistoryWithInterval(Integer labId, Integer count, Integer interval);
}

